/* * Copyright 2017 OmniFaces * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ package org.omnifaces.cdi.eager; import static org.omnifaces.util.BeansLocal.getAnnotation; import static org.omnifaces.util.BeansLocal.getReference; import java.util.logging.Logger; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.context.RequestScoped; import javax.enterprise.context.SessionScoped; import javax.enterprise.event.Observes; import javax.enterprise.inject.spi.AfterDeploymentValidation; import javax.enterprise.inject.spi.Annotated; import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.BeanManager; import javax.enterprise.inject.spi.Extension; import javax.enterprise.inject.spi.ProcessBean; import javax.faces.view.ViewScoped; import org.omnifaces.cdi.Eager; /** * CDI extension that collects beans annotated with <code>@</code>{@link Eager}. After deployment * collected beans are transferred to the {@link EagerBeansRepository}. * * @author Arjan Tijms * @since 1.8 * */ public class EagerExtension implements Extension { private static final Logger logger = Logger.getLogger(EagerExtension.class.getName()); // Private constants ---------------------------------------------------------------------------------------------- private static final String ERROR_EAGER_UNAVAILABLE = "@Eager is unavailable. The EagerBeansRepository could not be obtained from CDI bean manager."; // Variables ------------------------------------------------------------------------------------------------------ private EagerBeansRepository.EagerBeans eagerBeans = new EagerBeansRepository.EagerBeans(); // Actions -------------------------------------------------------------------------------------------------------- public <T> void collect(@Observes ProcessBean<T> event, BeanManager beanManager) { Annotated annotated = event.getAnnotated(); Eager eager = getAnnotation(beanManager, annotated, Eager.class); if (eager != null) { Bean<?> bean = event.getBean(); if (getAnnotation(beanManager, annotated, ApplicationScoped.class) != null) { eagerBeans.addApplicationScoped(bean); } else if (getAnnotation(beanManager, annotated, SessionScoped.class) != null) { eagerBeans.addSessionScoped(bean); } else if (getAnnotation(beanManager, annotated, ViewScoped.class) != null || getAnnotation(beanManager, annotated, org.omnifaces.cdi.ViewScoped.class) != null) { eagerBeans.addByViewId(bean, eager.viewId()); } else if (getAnnotation(beanManager, annotated, RequestScoped.class) != null) { eagerBeans.addByRequestURIOrViewId(bean, eager.requestURI(), eager.viewId()); } } } public void load(@Observes AfterDeploymentValidation event, BeanManager beanManager) { if (eagerBeans.isEmpty()) { return; } EagerBeansRepository eagerBeansRepository = getReference(beanManager, EagerBeansRepository.class); if (eagerBeansRepository == null) { logger.warning(ERROR_EAGER_UNAVAILABLE); return; } eagerBeansRepository.setEagerBeans(eagerBeans); } }